package generator.datastructure;

import java.util.ArrayList;

/**
 * Esta clase contiene todos aquellos atributos que sirven para identificar unívocamente
 * a un método.
 * @author Hirsch-Fernández*/
public class MethodDeclaration {
	
	/**indica el nombre del método*/
	private String methodName;
	
	/**indica la lista de tipos de los argumentos formales del método*/
	private ArrayList<String> parametersType; 
	
	/**indica el tipo de resultado devuelto por el método*/
	private String returnType;
	
	/**indica el nombre completo (con paquetes incluidos) de la clase a la que pertenece el método*/
	private String classOwner;
		

	/**Constructor de la clase que devuelve una instancia de la misma con todos sus atributos seteados
	 * @param classOwner
	 * 			nombre completo (con paquetes incluidos) de la clase a la que pertenece el método
	 * @param returnType
	 * 			tipo de resultado devuelto por el método
	 * @param name
	 * 			nombre del método
	 * @param parametersType
	 * 			lista de tipos de los argumentos formales del método
	 * */
	public MethodDeclaration(String classOwner, String returnType, String name, ArrayList<String> parametersType){
		this.classOwner = classOwner;
		this.methodName = name;
		this.parametersType = parametersType;		
		this.returnType = returnType;		
	}


	/**@return nombre del método*/
	public String getMethodName() {
		return methodName;
	}

	/**@param nombre del método*/
	public void setMethodName(String name) {
		this.methodName = name;
	}

	/**@return lista de tipos de los argumentos formales del método*/
	public ArrayList<String> getParametersType() {
		return parametersType;
	}
	
	/**@param lista de tipos de los argumentos formales del método*/
	public void setParametersType(ArrayList<String> parametersType) {
		this.parametersType = parametersType;
	}

	/**@return tipo de resultado devuelto por el método*/
	public String getReturnType() {
		return returnType;
	}

	/**@param tipo de resultado devuelto por el método*/
	public void setReturnType(String returnType) {
		this.returnType = returnType;
	}

	/**@return retorna el nombre completo (incluidos los paquetes) de la clase
	 * que contiene al método*/
	public String getClassOwner() {
		return classOwner;
	}

	/**@param nombre completo (incluidos los paquetes) de la clase
	 * que contiene al método*/
	public void setClassOwner(String classOwner) {
		this.classOwner = classOwner;
	}	
	
	/**redefinición del método equals.
	 * @return true si cada uno de los atributos conhicide en valor. False si al menos uno
	 * no cohincide*/
	public boolean equals(Object methodDec){
		MethodDeclaration md = (MethodDeclaration)methodDec; 
		
		if (md.getReturnType().equals(this.returnType)&&
			md.getMethodName().equals(this.methodName)&&
			md.getClassOwner().equals(this.classOwner)&&
			md.getParametersType().size() == this.parametersType.size()){
				
			ArrayList<String> paramTypes = md.getParametersType();
			ArrayList<String> paramTypes2 = this.getParametersType();
			
			for (int i = 0; i < paramTypes.size(); i++){
				if (!paramTypes.get(i).equals(paramTypes2.get(i)))
					return false;										
			}	
			return true;
		}
		return false;
	}
	
}
